home *** CD-ROM | disk | FTP | other *** search
/ 3D GFX / 3D GFX.iso / pcutils / windows / genesis / include / geometry.h < prev    next >
C/C++ Source or Header  |  1995-12-30  |  14KB  |  364 lines

  1. /*------------------------------------------------------------------
  2.             Geometry Include
  3.             ----------------
  4.  
  5.     This is the main Geometry include file. Any Geometry
  6.     implementation should include this as it provides
  7.     prototypes for all functions that must be implemented,
  8.     important macros, usefull helper function prototypes
  9.     and includes for any other relevent include files. Tools
  10.     should also include this file in order to get at the
  11.     Geometry code, although the helper functions are not
  12.     relevent to them
  13.  
  14.     (C) Silicon Dream Ltd 1994
  15.  
  16.   ------------------------------------------------------------------
  17.  
  18. Changes:                        Date:
  19. * Created file                        05/10/94
  20. */
  21.  
  22. #ifndef GEOMETRY
  23. #define GEOMETRY
  24.  
  25. #include <atomic.h>
  26. #include <cppmaths.h>
  27. #include <windows.h>
  28.  
  29. /* Handle types. All types are compatible with type Handle */
  30.  
  31. typedef ulong Handle;            // han
  32. typedef Handle HanCoorSys;        // hcsys
  33. typedef Handle HanObject;        // hobj
  34. typedef Handle HanPatch;        // hpat
  35. typedef Handle HanVertex;        // hver
  36. typedef Handle HanNormal;        // hnor
  37. typedef Handle HanEdge;            // hedg
  38. typedef Handle HanLight;        // hli
  39. typedef Handle HanSurf;            // hsur
  40.  
  41. /* All Geometry and helper functions return the following */
  42.  
  43. typedef ulong GeomErr;            // gerr
  44.  
  45. /* Define the NULL handle. If an implementation uses handles as indexes then
  46.    the indexes must be based at one */
  47.  
  48. #define NULL_HANDLE        ((Handle) 0)
  49.  
  50. /* Top level coordinate system handle */
  51.  
  52. #define HCSYS_TOP        NULL_HANDLE
  53.  
  54. /* Define coordinate system types */
  55.  
  56. #define CT_LEFTHAND        16384
  57. #define CT_RIGHTHAND        32768
  58.  
  59. /* usTransType values for ModCoorSys */
  60.  
  61. #define MCS_TRANS_LAST        0
  62. #define MCS_TRANS_FIRST        1
  63. #define MCS_REPLACE        2
  64.  
  65. /* Any implementation should not allow patches with greater number of edges
  66.    than the following, as this will prevent tools and helper functions using
  67.    static or local buffers on calls such as QryPatch, meaning that either the
  68.    calling code or the geometry engine is forced to dynamically allocate the
  69.    buffers all the time */
  70.  
  71. #define MAX_PATCH_EDGES        20
  72.  
  73. /* usFlags values for DefPatch and AddPatch */
  74.  
  75. #define DP_AUTOSMOOTH        1
  76. #define DP_SMOOTH_BY_SURF    2
  77. #define DP_SMOOTH_BY_ANGLE    4
  78. #define DP_DONT_VALIDATE    8
  79. #define DP_CONVEX        16
  80.  
  81. typedef struct Colourtag        // col
  82.     {
  83.     byte            byRed;        // Red component
  84.     byte            byGrn;        // Green component
  85.     byte            byBlu;        // Blue component
  86.     } Colour;
  87.  
  88. typedef struct VertInfotag        // vi
  89.     {
  90.     Vec            vec;        // Vertex position
  91.     ulong            ulNumPatches;    // Number of patches using vertex
  92.     ulong            ulRef;        // Reference to first patch (used for QryVertPatch)
  93.     float            fScrnX;        // Last screen X coor rendered
  94.     float            fScrnY;        // Last screen Y coor rendered
  95.     HanVertex        hverNext;    // Handle to next vertex in object
  96.     } VertInfo;
  97.  
  98. typedef struct NormInfotag        // ni
  99.     {
  100.     Vec            vec;        // Normal direction
  101.     HanNormal        hnorNext;    // Handle to next normal in object
  102.     } NormInfo;
  103.  
  104. #define PI_FLAT            1
  105. #define PI_VISIBLE        2
  106.  
  107. typedef struct PatchInfotag        // pi
  108.     {
  109.     ushort            usNumEdges;    // Number of edges (verts and norms)
  110.     ushort            usFlags;    // Patch flag values (PI_ values)
  111.     HanSurf            hsur;        // Surface handle
  112.     HanVertex        *ahver;        // Ptr to an array of vertex handles
  113.     HanNormal        *ahnor;        // Ptr to an array of normal handles
  114.     Vec            vecNorm;    // Normal of plane of patch
  115.     HanPatch        hpatNext;    // Handle to next patch in object
  116.     } PatchInfo;
  117.  
  118. typedef struct EdgeInfotag        // ei
  119.     {
  120.     HanVertex        hverA;        // Handle to vertex at one endpoint
  121.     HanVertex        hverB;        // Handle to vertex at other endpoint
  122.     HanPatch        hpatAB;        // Handle to patch using endpoints A to B
  123.     HanPatch        hpatBA;        // Handle to patch using endpoints B to A
  124.     HanEdge            hedgNext;    // Handle to next edge in object
  125.     } EdgeInfo;
  126.  
  127. typedef struct ObjectInfotag        // oi
  128.     {
  129.     ulong            ulNumVerts;    // Number of verticies used by object
  130.     ulong            ulNumNorms;    // Number of normals used by object
  131.     ulong            ulNumPatches;    // Number of patches used by object
  132.     ulong            ulNumEdges;    // Number of edges used by object
  133.     float            fNewVertTol;    // Indication of how close verticies can be
  134.     ulong            ulMemUsed;    // Total memory used by object (in bytes)
  135.     ushort            usCoorType;    // Coor type of object (CT_* value)
  136.     HanCoorSys        hcsys;        // Coor system object belongs to
  137.     HanVertex        hverFirst;    // Handle to first vertex
  138.     HanNormal        hnorFirst;    // Handle to first normal
  139.     HanPatch        hpatFirst;    // Handle to first patch
  140.     HanEdge            hedgFirst;    // Handle to first edge
  141.     HanObject        hobjNext;    // Handle to next object in coor system
  142.     } ObjectInfo;
  143.  
  144. typedef struct CoorSysInfotag        // csi
  145.     {
  146.     ushort            usType;        // Coordinate system type (CT_* value)
  147.     Mat            matToParent;    // Our position relative to parent
  148.     Mat            matFromParent;    // Parents position relative to us
  149.     HanCoorSys        hcsysParent;    // Handle to parent coordinate system
  150.     HanCoorSys        hcsysNext;    // Handle to next sibling coordinate system
  151.     HanCoorSys        hcsysFirstChild;// Handle to first child coordinate system
  152.     HanLight        hliFirst;    // Handle to first light in coordinate system
  153.     HanObject        hobjFirst;    // Handle to first object in coordinate system
  154.     } CoorSysInfo;
  155.  
  156. #define LI_DIRECTIONAL        1
  157.  
  158. typedef struct LightDeftag        // ld
  159.     {
  160.     Vec            vecPos;        // Light position
  161.     Vec            vecDir;        // Direction of light
  162.     ushort            usFlags;    // Flags (LI_* values)
  163.     float            fInt;        // Intensity (0.0 - 1.0)
  164.     float            fAng;        // Angle of spread of light
  165.     Colour            col;        // Colour of light
  166.     HanLight        hliNext;    // Handle to next light in coor system
  167.     } LightDef;
  168.  
  169. /* Surface type flags */
  170.  
  171. #define DS_TEXTURE        2
  172. #define DS_RECURSIVE_TEXTURE    4
  173. #define DS_TILE_TEXTURE        8
  174. #define DS_BUMPED        16
  175. #define DS_ALL            (DS_TEXTURE | DS_RECURSIVE_TEXTURE | DS_TILE_TEXTURE | DS_BUMPED)
  176.  
  177. /* Specular reflection characterisitic type */
  178.  
  179. #define SRC_DULL        0
  180. #define SRC_ROCK        SRC_DULL    // All these do not have
  181. #define SRC_RUBBER        SRC_DULL    // specular reflections
  182. #define SRC_WOOD        SRC_DULL    // and are therefore the
  183. #define SRC_FABRIC        SRC_DULL    // same as SRC_DULL
  184. #define SRC_CONSTANT        1
  185. #define SRC_LINEAR        2
  186. #define SRC_SILVER        3
  187. #define SRC_GOLD        4
  188. #define SRC_GLASS        5
  189. #define SRC_BRASS        6
  190. #define SRC_COPPER        7
  191. #define SRC_ALUMINIUM        8
  192. #define SRC_IRON        9
  193. #define SRC_PLASTIC        10
  194. #define SRC_WATER        11
  195. #define SRC_CHINA        12
  196. #define SRC_LEATHER        13
  197. #define SRC_SILK        14
  198.  
  199. /* Handle used to represent see through indexes in recursive textures */
  200.  
  201. #define HSUR_SEE_THROUGH    ((Handle) ULONG_MAX)
  202.  
  203. typedef struct SurfTypetag        // st
  204.     {
  205.     Colour            col;        // Basic RGB colour
  206.     ushort            usFlags;    // Flags (DS_* values)
  207.     ushort            usSpecRefChar;    // Specifies specular reflection characteristics
  208.     float            fShineCoef;    // Degree of 'polishedness' (0.0 - 1.0)
  209.     float            fTransCoef;    // Degree of 'see throughness' (0.0 - 1.0)
  210.     HanCoorSys        hcsysTex;    // Coor system texture is placed in
  211.     Mat            matTex;        // Orientation within coor sys of texture bitmap
  212.     HanSurf            hsurSurf0;    // Surface showing for pixel value 0
  213.     HanSurf            hsurSurf1;    // Surface showing for pixel value 1
  214.     HanSurf            hsurSurf2;    // Surface showing for pixel value 2
  215.     HanSurf            hsurSurf3;    // Surface showing for pixel value 3
  216.     float            fBumpHeight;    // Maximum height of bump mapping
  217.     char            szFNTex[128];    // Texture filename
  218.     } SurfType;
  219.  
  220. /* Geometry function prototypes */
  221.  
  222. GeomErr _dyn GetErrorText (GeomErr gerr, char *szBuff, ushort usBuffSize);
  223. GeomErr _dyn Initialise (void);
  224. GeomErr _dyn Terminate (void);
  225. GeomErr _dyn AddCoorSys (HanCoorSys hcsysParent, Mat &matToParent, Mat &matFromParent,
  226.              ushort usType, HanCoorSys *phcsys);
  227. GeomErr _dyn DelCoorSys (HanCoorSys hcsys);
  228. GeomErr _dyn QryCoorSys (HanCoorSys hcsys, CoorSysInfo *pcsi);
  229. GeomErr _dyn ModCoorSys (HanCoorSys hcsys, Mat &matToParent, Mat &matFromParent,
  230.              ushort usTransType);
  231. GeomErr _dyn SetCamera (HanCoorSys hcsys, Vec &vecPos, Vec &vecDir, Vec &vecUp,
  232.             ushort usResX, ushort usResY);
  233. GeomErr _dyn AddObject (HanCoorSys hcsys, float fNewVertTol, HanObject *phobj);
  234. GeomErr _dyn DelObject (HanObject hobj);
  235. GeomErr _dyn QryObject (HanObject hobj, ObjectInfo *poi);
  236. GeomErr _dyn PrtObject (HanObject hobj);
  237. GeomErr _dyn AddVertex (HanObject hobj, Vec &vec, HanVertex *phver);
  238. GeomErr _dyn DelVertex (HanObject hobj, HanVertex hver);
  239. GeomErr _dyn QryVertex (HanObject hobj, HanVertex hver, VertInfo *pvi);
  240. GeomErr _dyn ModVertex (HanObject hobj, HanVertex hver, Vec &vec);
  241. GeomErr _dyn AddNormal (HanObject hobj, Vec &vec, HanNormal *phnor);
  242. GeomErr _dyn DelNormal (HanObject hobj, HanNormal hnor);
  243. GeomErr _dyn QryNormal (HanObject hobj, HanNormal hnor, NormInfo *pni);
  244. GeomErr _dyn ModNormal (HanObject hobj, HanNormal hnor, Vec &vec);
  245. GeomErr _dyn QryEdge (HanObject hobj, HanEdge hedg, EdgeInfo *pei);
  246. GeomErr _dyn AddLight (HanCoorSys hcsys, LightDef *pld, HanLight *phli);
  247. GeomErr _dyn DelLight (HanLight hli);
  248. GeomErr _dyn QryLight (HanLight hli, LightDef *pld);
  249. GeomErr _dyn ModLight (HanLight hli, LightDef *pld);
  250. GeomErr _dyn SetAmbient (float fInt);
  251. GeomErr _dyn DefPatch (HanObject hobj, ushort usNumEdges, ushort usFlags, float fSmoothAng,
  252.                HanVertex *ahver, HanNormal *ahnor, HanSurf hsur, ushort *pusNumPats,
  253.                HanPatch *ahpat);
  254. GeomErr _dyn DelPatch (HanObject hobj, HanPatch hpat);
  255. GeomErr _dyn QryPatch (HanObject hobj, HanPatch hpat, PatchInfo *ppi);
  256. GeomErr _dyn QryVertPatch (ulong *pulRef, HanPatch *phpat);
  257. GeomErr _dyn DeleteRenBitmap (BITMAPINFO huge *pbmi);
  258. GeomErr _dyn Render (BITMAPINFO *huge *ppbmi, ushort usResX, ushort usResY);
  259. GeomErr _dyn UpdateImage (ulong ulHDC, BITMAPINFO huge *pbmi, ushort usX, ushort usY);
  260. GeomErr _dyn DefSurfType (SurfType *pst, HanSurf *phsur);
  261. GeomErr _dyn DelSurfType (HanSurf hsur);
  262. GeomErr _dyn QrySurfType (HanSurf hsur, SurfType *pst, BITMAPINFOHEADER *pbmih,
  263.               ulong *pulNumPats);
  264. GeomErr _dyn SetToFirstSurfType (ulong *pulRef);
  265. GeomErr _dyn GetNextSurfType (ulong *pulRef, HanSurf *phsur);
  266. GeomErr _dyn ModSurfType (HanSurf hsur, SurfType *pst);
  267. GeomErr _dyn Get3DLine (HanCoorSys hcsys, Vec &vecA, Vec &vecB,
  268.             float *pfStartX, float *pfStartY, float *pfEndX, float *pfEndY);
  269. GeomErr _dyn Get3DPoint (HanCoorSys hcsys, Vec &vec, float *pfX, float *pfY);
  270. GeomErr _dyn SaveScene (HFILE hfile, HanCoorSys hcsys,
  271.             ulong *pulNumCSys, HanCoorSys *ahcsys,
  272.             ulong *pulNumObjs, HanObject *ahobj);
  273. GeomErr _dyn LoadScene (HFILE hfile, HanCoorSys hcsysParent, char *szTexPath,
  274.             ulong *pulNumCSys, HanCoorSys *ahcsys,
  275.             ulong *pulNumObjs, HanObject *ahobj);
  276.  
  277. /* Standard error values */
  278.  
  279. #define GERR_OK                0L
  280. #define GERR_BASE            0x1000000
  281. #define GERR_COINCIDENT_POINTS        (GERR_BASE+0)
  282. #define GERR_THIN_SEGMENT        (GERR_BASE+1)
  283. #define GERR_NOT_ON_PLANE        (GERR_BASE+2)
  284. #define GERR_OUT_OF_MEMORY        (GERR_BASE+3)
  285. #define GERR_BUFFER_TOO_SMALL        (GERR_BASE+4)
  286. #define GERR_NOT_ENOUGH_POINTS        (GERR_BASE+5)
  287. #define GERR_IN_USE            (GERR_BASE+6)
  288. #define GERR_CANT_SET_CAM_IN_TOP    (GERR_BASE+7)
  289. #define GERR_INVALID_LIGHT_INT        (GERR_BASE+8)
  290. #define GERR_TOO_MANY_SURFACE_TYPES    (GERR_BASE+9)
  291. #define GERR_BITMAP_FILE_NOT_FOUND    (GERR_BASE+10)
  292. #define GERR_NOT_A_BMP_FILE        (GERR_BASE+11)
  293. #define GERR_IMAGE_SIZE_NOT_MULT_4    (GERR_BASE+12)
  294. #define GERR_NOT_VISIBLE        (GERR_BASE+13)
  295. #define GERR_TOO_MANY_BITMAPS        (GERR_BASE+14)
  296. #define GERR_BITMAP_TOO_SMALL        (GERR_BASE+15)
  297. #define GERR_INVALID_HANDLE        (GERR_BASE+16)
  298. #define GERR_GEOMETRY_DIDNT_CREATE_BMP    (GERR_BASE+17)
  299. #define GERR_INT_PROCESSING_ERROR    (GERR_BASE+18)
  300. #define GERR_INVALID_GEN_FILE        (GERR_BASE+19)
  301. #define GERR_INVALID_OPP_IN_TOP        (GERR_BASE+20)
  302. #define GERR_UNKNOWN_ERROR        (GERR_BASE+500)
  303.  
  304. /*********************************** Helper section ***********************************/
  305.  
  306. /* usType values for ExtractVecs */
  307.  
  308. #define EV_NORMS        0
  309. #define EV_VERTS        1
  310.  
  311. /* usFlags values for ValidPatch */
  312.  
  313. #define VP_CHECK_THIN_SEGMENT    1
  314. #define VP_CHECK_ON_PLANE    2
  315.  
  316. /* usFlag values for CompNormal (CT_* values can also be used) */
  317.  
  318. #define CN_DIRECTION_IMPORTANT    1
  319. #define CN_CONVEX        2
  320.  
  321. /* usFlags values for Split */
  322.  
  323. #define SP_SUPPORT_CONCAVE    1
  324. #define SP_RETURN_INDEX        2
  325.  
  326. /* usFlags for Autosmooth are the DP_SMOOTH_* flags */
  327.  
  328. typedef struct ASUndoBufftag        // asub
  329.     {
  330.     HanObject        hobj;
  331.     ushort            usNew;
  332.     ushort            usMod;
  333.     HanNormal        *ahnorNew;
  334.     HanNormal        *ahnorMod;
  335.     Vec            *avecMod;
  336.     } ASUndoBuff;
  337.  
  338. /* Helper functions */
  339.  
  340. #define Gerr(x) RegisterError((GeomErr) x, __FILE__, __LINE__)
  341. GeomErr RegisterError (GeomErr gerrIn, char *szFNIn, ushort usLineIn);
  342.  
  343. GeomErr GetHlpErrorText (GeomErr gerr, char *szBuff, ushort usBuffSize);
  344. GeomErr ValidPatch (Vec *avec, ushort usNumVecs, ushort usFlags);
  345. GeomErr ExtractVecs (HanObject hobj, ushort usType, Handle *ahan, ushort usNum, Vec **pavec);
  346. GeomErr CompNormal (Vec *avec, ushort usNumVecs, ushort usFlags, Vec *pvecNorm);
  347. GeomErr Split (Vec *avecMain, ushort usNumMainVecs,
  348.            ushort usMaxPerPatch, ushort usFlags,
  349.            ushort *pusNumSets, void **apvSets, ushort *ausNumInSets);
  350. GeomErr Autosmooth (HanObject hobj, HanVertex *ahver, ushort usNumVerts, Vec &vecNorm,
  351.             ushort usFlags, HanSurf hsur, float fSmoothAng, HanNormal *ahnor,
  352.             ASUndoBuff *pasub);
  353. GeomErr CommitAS (ASUndoBuff *pasub);
  354. GeomErr UndoAS (ASUndoBuff *pasub);
  355. GeomErr LoadBmp (char *szFN, BITMAPINFO huge **ppbmi);
  356. GeomErr SaveSceneHlp (HFILE hfile, HanCoorSys hcsys,
  357.               ulong *pulNumCSys, HanCoorSys *ahcsys,
  358.               ulong *pulNumObjs, HanObject *ahobj);
  359. GeomErr LoadSceneHlp (HFILE hfile, HanCoorSys hcsysParent, char *szTexPath,
  360.               ulong *pulNumCSys, HanCoorSys *ahcsys,
  361.               ulong *pulNumObjs, HanObject *ahobj);
  362.  
  363. #endif
  364.